/**
 * 数据表配置 AI 智能分析
 */

/**
 * 获取AI配置
 */
const getAIConfig = () => {
  const apiKey = import.meta.env.VITE_AI_API_KEY
  const baseUrl = import.meta.env.VITE_AI_BASE_URL
  const model = import.meta.env.VITE_AI_MODEL

  if (!apiKey) {
    throw new Error('请在环境变量中配置 VITE_AI_API_KEY')
  }

  if (!baseUrl) {
    throw new Error('请在环境变量中配置 VITE_AI_BASE_URL')
  }

  if (!model) {
    throw new Error('请在环境变量中配置 VITE_AI_MODEL')
  }

  return {
    apiKey,
    baseUrl,
    model
  }
}

/**
 * 使用 AI 智能分析数据表配置
 * @param {Object} tableInfo - 表信息
 * @param {Array} columns - 字段列表
 * @returns {Promise<Object>} AI 推荐的数据表配置
 */
export async function analyzeDataTableWithAI(tableInfo, columns) {
  try {
    const config = getAIConfig()
    
    // 构建提示词
    const prompt = buildDataTablePrompt(tableInfo, columns)
    
    // 调用 OpenAI 兼容的 API
    const response = await fetch(`${config.baseUrl}/chat/completions`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${config.apiKey}`
      },
      body: JSON.stringify({
        model: `${config.model}`,
        messages: [
          {
            role: 'system',
            content: `你是一个数据表配置专家。请根据表名、表描述和字段信息，智能推荐数据表的值字段和显示字段配置。

数据表说明：
- 数据表是指其他表可以关联的基础数据表（如字典表、用户表、部门表等）
- 值字段：用于关联的实际值，通常是主键或ID字段
- 显示字段：用于前端显示的字段，通常是名称、标题等可读性强的字段

请严格按照JSON格式返回，不要包含任何其他内容。`
          },
          {
            role: 'user',
            content: prompt
          }
        ],
        max_tokens: 2000,
        temperature: 0.3
      })
    })

    if (!response.ok) {
      throw new Error(`API 请求失败: ${response.status} ${response.statusText}`)
    }

    const data = await response.json()
    
    if (!data.choices || data.choices.length === 0) {
      throw new Error('API 返回数据格式错误')
    }

    const aiResponse = data.choices[0].message.content
    
    // 解析 AI 返回的结果
    const result = parseDataTableAIResponse(aiResponse, columns)
    
    return result
    
  } catch (error) {
    console.error('AI 分析数据表配置失败:', error)
    throw new Error(`AI 分析失败: ${error.message}`)
  }
}

/**
 * 构建数据表分析提示词
 */
function buildDataTablePrompt(tableInfo, columns) {
  const columnInfo = columns.map(col => ({
    columnName: col.columnName,
    columnType: col.columnType,
    javaType: col.javaType,
    columnComment: col.columnComment || '',
    isPk: col.isPk,
    isIncrement: col.isIncrement
  }))

  return `请分析以下数据库表的数据表配置：

表名: ${tableInfo.tableName}
表描述: ${tableInfo.tableComment}

字段信息:
${JSON.stringify(columnInfo, null, 2)}

请推荐合适的数据表配置，返回JSON格式如下：
{
  "dataValueField": "推荐的值字段名",
  "dataDisplayField": "推荐的显示字段名",
  "reasoning": {
    "valueFieldReason": "值字段选择理由",
    "displayFieldReason": "显示字段选择理由"
  }
}

推荐规则：
1. 值字段通常选择：
   - 主键字段（如 id）
   - 唯一标识字段（如 code）
   - 自增字段

2. 显示字段通常选择：
   - 名称字段（如 name、title、label）
   - 描述性字段（如 description、remark）
   - 用户友好的标识字段

3. 根据表名和字段名智能推荐：
   - 用户表：值字段选user_id，显示字段选username或real_name
   - 部门表：值字段选dept_id，显示字段选dept_name
   - 字典表：值字段选dict_code或id，显示字段选dict_label或dict_name
   - 分类表：值字段选category_id，显示字段选category_name
   - 宠物表：值字段选pet_id，显示字段选name

请根据具体的表信息进行智能推荐。`
}

/**
 * 解析数据表 AI 返回的结果
 */
function parseDataTableAIResponse(aiResponse, columns) {
  try {
    // 提取JSON部分
    const jsonMatch = aiResponse.match(/\{[\s\S]*\}/)
    if (!jsonMatch) {
      throw new Error('AI 返回结果格式不正确')
    }

    const aiResult = JSON.parse(jsonMatch[0])
    
    if (!aiResult.dataValueField || !aiResult.dataDisplayField) {
      throw new Error('AI 返回结果缺少必要字段')
    }

    // 验证推荐的字段是否存在
    const valueField = columns.find(col => col.columnName === aiResult.dataValueField)
    const displayField = columns.find(col => col.columnName === aiResult.dataDisplayField)

    if (!valueField) {
      console.warn(`AI 推荐的值字段 ${aiResult.dataValueField} 不存在，使用默认值`)
      // 使用主键或第一个字段作为默认值
      const pkField = columns.find(col => col.isPk === '1')
      aiResult.dataValueField = pkField ? pkField.columnName : columns[0]?.columnName
    }

    if (!displayField) {
      console.warn(`AI 推荐的显示字段 ${aiResult.dataDisplayField} 不存在，使用默认值`)
      // 查找名称类字段作为默认值
      const nameField = columns.find(col => 
        col.columnName.toLowerCase().includes('name') || 
        col.columnComment?.includes('名称')
      )
      aiResult.dataDisplayField = nameField ? nameField.columnName : columns[0]?.columnName
    }

    return {
      dataValueField: aiResult.dataValueField,
      dataDisplayField: aiResult.dataDisplayField,
      reasoning: aiResult.reasoning || {}
    }
    
  } catch (error) {
    console.error('解析数据表 AI 响应失败:', error)
    throw new Error(`解析 AI 响应失败: ${error.message}`)
  }
}